Equipe 01_Systèmes embarqués_Livrable-02

Équipe 01 : ALLOUCH Bilal (Chef d’équipe) / COLSON Paul / LECOQ Aliça / LINARD Raphaël

Pseudocode — Station météo embarquée

1) Variables globales

Modes possibles :
  STANDARD
  ECONOMIQUE
  MAINTENANCE
  CONFIGURATION

modeCourant                 // mode actif
modePrecedent               // utile pour sortir de Maintenance

Paramètres réglables :
  LOG_INTERVAL_MIN          // minutes entre deux mesures en Standard, ex 10
  TIMEOUT_CAPTEUR_SEC       // délai max d’un capteur, ex 30
  FILE_MAX_SIZE_OCTETS      // taille max d’un fichier .LOG avant rotation

Chronos :
  chronoCycle               // temps depuis la dernière acquisition
  chronoInactiviteConfig    // temps depuis la dernière commande en Configuration

Drapeaux posés par interruptions :
  flagDemandeEco            // passer en Economique
  flagDemandeMaintenance    // passer en Maintenance
  flagRetourStandard        // revenir en Standard
  flagQuitterMaintenance    // quitter Maintenance et revenir au modePrecedent

Données d’acquisition :
  horodatageActuel          // date et heure
  mesures                   // {nomCapteur -> valeur ou "NA"}
  compteurGPS               // pour lire le GPS une fois sur deux en Eco

2) Fonction principale

FonctionPrincipale():
  initialiser le microcontrôleur
  initialiser les capteurs
  initialiser l’horloge temps réel (RTC)
  initialiser la carte mémoire
  initialiser la console série
  initialiser la LED d’état
  installer les interruptions des boutons (voir plus bas)

  SI le bouton rouge est maintenu au démarrage
      ALORS modeCourant ← CONFIGURATION
  SINON
      modeCourant ← STANDARD

  TANT QUE vrai
      lire et remettre à zéro les drapeaux d’interruption
      appliquer immédiatement une demande de changement :
        SI flagDemandeEco → modeCourant ← ECONOMIQUE
        SI flagDemandeMaintenance → modeCourant ← MAINTENANCE
        SI flagRetourStandard → modeCourant ← STANDARD
        SI flagQuitterMaintenance → modeCourant ← modePrecedent

      SELON modeCourant
         CAS STANDARD → ModeStandard()
         CAS ECONOMIQUE → ModeEconomique()
         CAS MAINTENANCE → ModeMaintenance()
         CAS CONFIGURATION → ModeConfiguration()

3) Interruptions des boutons

InterruptionBoutonVert_AppuiLong():
  flagDemandeEco ← vrai

InterruptionBoutonRouge_AppuiLong():
  SI modeCourant == STANDARD
       flagDemandeMaintenance ← vrai
  SINON SI modeCourant == ECONOMIQUE
       flagRetourStandard ← vrai         // ton choix : éco → retour standard
  SINON SI modeCourant == MAINTENANCE
       flagQuitterMaintenance ← vrai     // maintenance → retour au modePrecedent
  SINON
       // en Configuration on ne change pas par bouton, on laisse le retour auto
       ne rien faire

4) Mode Standard

ModeStandard():
  allumer la LED verte
  remettre chronoCycle à zéro

  // 1. Acquisition
  mesures ← LireTousLesCapteursAvecNA(TIMEOUT_CAPTEUR_SEC)
  horodatageActuel ← LireHeureDepuisRTC()

  // 2. Assemblage + enregistrement
  ligne ← AssemblerLigne(horodatageActuel, mesures)
  résultat ← EcrireLigneSurCarte(ligne, FILE_MAX_SIZE_OCTETS)
  SI résultat == "CARTE_PLEINE"RotationDeFichier()
  SI résultat == "ERREUR_ECRITURE" → allumer LED rouge et blanc

  // 3. Contrôles d’erreurs
  SI RTC en erreur → LED rouge et bleu
  SI GPS en erreur → LED rouge et jaune
  SI données incohérentes → LED rouge et vert

  // 4. Attendre jusqu’à la prochaine mesure, sans bloquer les interruptions
  TANT QUE tempsEcoule(chronoCycle) < LOG_INTERVAL_MIN
        lire et remettre à zéro les drapeaux
        SI flagDemandeEco → modeCourant ← ECONOMIQUE, QUITTER
        SI flagDemandeMaintenance → modeCourant ← MAINTENANCE, modePrecedent ← STANDARD, QUITTER
        // sinon, petites tâches de fond
  // on termine la fonction, la boucle principale rappellera Standard pour la prochaine acquisition

5) Mode Économique

ModeEconomique():
  allumer la LED bleue
  remettre chronoCycle à zéro

  // 1. Acquisition, GPS une fois sur deux
  mesures ← LireTousLesCapteursAvecNA(
               TIMEOUT_CAPTEUR_SEC,
               regleGPS = "UNE_FOIS_SUR_DEUX",
               compteurGPS)
  horodatageActuel ← LireHeureDepuisRTC()

  // 2. Assemblage + enregistrement
  ligne ← AssemblerLigne(horodatageActuel, mesures)
  résultat ← EcrireLigneSurCarte(ligne, FILE_MAX_SIZE_OCTETS)
  SI résultat == "CARTE_PLEINE"RotationDeFichier()
  SI résultat == "ERREUR_ECRITURE" → LED rouge et blanc

  // 3. Contrôles
  SI RTC en erreur → LED rouge et bleu
  SI GPS en erreur → LED rouge et jaune
  SI données incohérentes → LED rouge et vert

  // 4. Attente doublée, interruptions actives
  TANT QUE tempsEcoule(chronoCycle) < (2 × LOG_INTERVAL_MIN)
        lire et remettre à zéro les drapeaux
        SI flagDemandeMaintenance → modeCourant ← MAINTENANCE, modePrecedent ← ECONOMIQUE, QUITTER
        SI flagRetourStandard → modeCourant ← STANDARD, QUITTER

6) Mode Maintenance

ModeMaintenance():
  allumer la LED orange
  suspendre l’enregistrement automatique sur la carte pour la sécurité

  REPETER
     lire et remettre à zéro les drapeaux
     SI flagQuitterMaintenance
          reprendre l’enregistrement automatique
          modeCourant ← modePrecedent
          QUITTER

     SI une commande arrive de l’ordinateur ET demande "mesures directes"
          m ← LireTousLesCapteursAvecNA(TIMEOUT_CAPTEUR_SEC, lectureImmédiate = vrai)
          AfficherSurConsole(horodatageActuel, m)

     SI une commande arrive et demande "autoriser retrait carte"
          AutoriserRetraitCarte()
          AfficherSurConsole("Carte SD retirée ou remise en sécurité")
  JUSQU’A changement de mode par drapeau

7) Mode Configuration

ModeConfiguration():
  allumer la LED jaune
  arrêter l’acquisition automatique des capteurs
  remettre chronoInactiviteConfig à zéro

  TANT QUE tempsEcoule(chronoInactiviteConfig) < 30 minutes
      lire et remettre à zéro les drapeaux
      // on ne change pas de mode par bouton ici, on laisse la règle du retour auto

      cmd ← LireCommandeConsoleSiPresente()
      SI aucune commande
           continuer

      remettre chronoInactiviteConfig à zéro
      TraiterCommandeConfiguration(cmd)   // intervalle, timeout, taille fichier, activer/désactiver capteurs,
                                          // seuils, horloge/date/jour, reset, version
      ConfirmerSurConsole(cmd)

  // inactivité : retour principal
  reprendre l’acquisition automatique
  modeCourant ← STANDARD

8) Fonctions utilitaires

LireTousLesCapteursAvecNA(timeout, regleGPS?, compteurGPS?, lectureImmédiate?):
  créer un tableau vide
  pour chaque capteur actif
     SI capteur == GPS ET regleGPS == "UNE_FOIS_SUR_DEUX" ET (compteurGPS % 2 == 1)
          enregistrer "NA" pour GPS
          compteurGPS ← compteurGPS + 1
          continuer
     valeur, ok ← MesurerCapteurAvecTimeout(capteur, timeout)
     SI ok → tableau[nomCapteur] ← valeur
     SINON → tableau[nomCapteur] ← "NA"
  RETOUR tableau
AssemblerLigne(horodatage, mesures):
  // Exemple de format clair
  // "AAAA-MM-JJ HH:MM:SS; TempAir; Humidite; Pression; Luminosite; GPS"
  créer une chaîne texte à partir de l’horodatage et des valeurs
  RETOUR la chaîne
EcrireLigneSurCarte(ligne, tailleMax):
  SI tailleFichierCourant ≥ tailleMax → RETOUR "CARTE_PLEINE"
  SI écriture réussie → RETOUR "OK"
  SINON → RETOUR "ERREUR_ECRITURE"
RotationDeFichier():
  fermer le fichier courant
  créer un nouveau fichier .LOG avec un nom horodaté ou un indice
LireHeureDepuisRTC():
  demander date et heure à l’horloge
  RETOUR l’horodatage
TraiterCommandeConfiguration(cmd):
  SI cmd commence par "LOG_INTERVAL=" → mettre à jour LOG_INTERVAL_MIN
  SI cmd commence par "TIMEOUT=" → mettre à jour TIMEOUT_CAPTEUR_SEC
  SI cmd commence par "FILE_MAX_SIZE=" → mettre à jour FILE_MAX_SIZE_OCTETS
  SI cmd commence par "CAPTEUR=" → activer ou désactiver le capteur visé
  SI cmd commence par "SEUIL=" → régler les seuils du capteur visé
  SI cmd ∈ {CLOCK, DATE, DAY} → mettre à l’heure l’horloge
  SI cmd == RESET → remettre tous les paramètres par défaut
  SI cmd == VERSION → afficher la version et le lot

Explication :

  1. Au démarrage la station prépare tout. Si le bouton rouge est maintenu, elle ouvre le mode Configuration. Sinon elle démarre en mode Standard.

  2. En mode Standard la station lit tous les capteurs. Si un capteur ne répond pas dans le temps prévu, elle écrit NA pour ce capteur. Elle demande la date et l’heure, assemble une ligne de texte claire, puis l’enregistre dans un fichier sur la carte mémoire. Si le fichier est plein, elle crée un nouveau fichier. En cas d’erreur d’écriture, la LED rouge et blanc s’allume. Elle vérifie aussi les erreurs possibles, puis elle attend jusqu’au prochain intervalle. Pendant cette attente, elle reste réactive aux interruptions.

  3. Les interruptions sont des réactions immédiates aux boutons. L’interruption ne fait presque rien. Elle pose un drapeau que la station lit tout de suite. Par exemple, un appui long sur le bouton vert demande le mode Économique. Un appui long sur le bouton rouge demande la Maintenance, ou le retour en Standard si on est en Économique, ou la sortie de Maintenance si on est en Maintenance.

  4. En mode Économique la station mesure moins souvent. Le GPS est lu une fois sur deux pour economiser l’énergie. Le reste est identique. Un appui long rouge ramène en Standard. Un appui long rouge peut aussi aller vers Maintenance selon le besoin.

  5. En mode Maintenance l’écriture automatique sur la carte est suspendue. Le technicien peut demander des mesures en direct sur l’ordinateur et retirer la carte mémoire en toute sécurité. Un appui long rouge quitte la Maintenance et revient au mode précédent, Standard ou Économique.

  6. En mode Configuration l’utilisateur tape des commandes simples depuis l’ordinateur. Il peut changer l’intervalle de mesure, le délai des capteurs, la taille maximale des fichiers, activer ou désactiver des capteurs, régler l’horloge, réinitialiser les paramètres, afficher la version. S’il ne fait rien pendant 30 minutes, la station retourne toute seule au mode Standard.

  7. Les fonctions utilitaires sont des petits outils réutilisables. Elles lisent les capteurs avec la règle NA, créent une ligne de texte, écrivent sur la carte, gèrent les fichiers, lisent l’heure. Grâce à elles, le code reste court et facile à comprendre.

  8. Au final le système tourne en continu. Il collecte les données, les enregistre, affiche les états avec la LED, et reste toujours prêt à changer de mode dès que l’utilisateur appuie sur un bouton.